package com.moyoutian.leetcode;

/**
 * 2047. 句子中的有效单词数
 * <p>
 * <p>
 * 句子仅由小写字母（'a' 到 'z'）、数字（'0' 到 '9'）、连字符（'-'）、标点符号（'!'、'.' 和 ','）以及空格（' '）组成。每个句子可以根据空格分解成 一个或者多个 token ，这些 token 之间由一个或者多个空格 ' ' 分隔。
 * <p>
 * <p>
 * 如果一个 token 同时满足下述条件，则认为这个 token 是一个有效单词：
 * <p>
 * <p>
 * 仅由小写字母、连字符和/或标点（不含数字）。
 * <p>
 * 至多一个 连字符 '-' 。如果存在，连字符两侧应当都存在小写字母（"a-b" 是一个有效单词，但 "-ab" 和 "ab-" 不是有效单词）。
 * <p>
 * 至多一个 标点符号。如果存在，标点符号应当位于 token 的 末尾 。
 * <p>
 * 这里给出几个有效单词的例子："a-b."、"afad"、"ba-c"、"a!" 和 "!" 。
 * <p>
 * <p>
 * 给你一个字符串 sentence ，请你找出并返回 sentence 中 有效单词的数目 。
 * <p>
 * <p>
 * <p>
 * 示例 1：
 * <p>
 * 输入：sentence = "cat and  dog"
 * <p>
 * 输出：3
 * <p>
 * 解释：句子中的有效单词是 "cat"、"and" 和 "dog"
 * <p>
 * <p>
 * 示例 2：
 * <p>
 * <p>
 * 输入：sentence = "!this  1-s b8d!"
 * <p>
 * 输出：0
 * <p>
 * 解释：句子中没有有效单词
 * <p>
 * "!this" 不是有效单词，因为它以一个标点开头
 * <p>
 * "1-s" 和 "b8d" 也不是有效单词，因为它们都包含数字
 * <p>
 * 示例 3：
 * <p>
 * <p>
 * 输入：sentence = "alice and  bob are playing stone-game10"
 * <p>
 * 输出：5
 * <p>
 * 解释：句子中的有效单词是 "alice"、"and"、"bob"、"are" 和 "playing"
 * <p>
 * "stone-game10" 不是有效单词，因为它含有数字
 * <p>
 * 示例 4：
 * <p>
 * <p>
 * 输入：sentence = "he bought 2 pencils, 3 erasers, and 1  pencil-sharpener."
 * <p>
 * 输出：6
 * <p>
 * 解释：句子中的有效单词是 "he"、"bought"、"pencils,"、"erasers,"、"and" 和 "pencil-sharpener."
 * <p>
 * <p>
 * 提示：
 * <p>
 * 1 <= sentence.length <= 1000
 * <p>
 * sentence 由小写英文字母、数字（0-9）、以及字符（' '、'-'、'!'、'.' 和 ','）组成
 * <p>
 * 句子中至少有 1 个 token
 * <p>
 * 通过次数7,989提交次数23,750
 */
public class Demo2047 {

    public static void main(String[] args) {
        String sentence = "a-b-c aa-b b-a";
        System.out.println(countValidWords(sentence));
    }

    public static int countValidWords(String sentence) {
        int count = 0;
        int azCount = 0;//当前单词 a-z的数量
        int lCount = 0;//当前单词 的连接符数量
        boolean lFlag = true;//当前单词 连接符是否是全部满足 x-x 分割字母
        int nCount = 0;//当前单词 的数字数量
        int eCount = 0;
        boolean eFlag = true;//当前单词 标点符号是否满足在结尾
        for (int i = 0; i < sentence.length(); i++) {
            char c = sentence.charAt(i);
            if ('a' <= c && c <= 'z') {
                azCount++;
            } else if (' ' == c) {
                if ((azCount > 0 || eCount == 1) && nCount == 0 && lCount < 2 && lFlag && eFlag) {//长度大于零，不能有数字，- 连接符的数量小于零
                    if (i - 1 > 0)
                        System.out.println(sentence.charAt(i - 1));
                    count++;
                }
                //重新初始化计算当前单词
                azCount = 0;
                nCount = 0;
                lFlag = true;
                lCount = 0;
                eFlag = true;
                eCount = 0;
            } else if ('0' <= c && c <= '9') {
                nCount++;
            } else if ('-' == c) {//至多一个连接符号
                lCount++;
                lFlag = false;
                if (i > 0 && i + 1 < sentence.length()) {//边界判断
                    char lc = sentence.charAt(i - 1);
                    char nc = sentence.charAt(i + 1);
                    lFlag = 'a' <= lc && lc <= 'z' && 'a' <= nc && nc <= 'z';
                }
            } else if (',' == c || '.' == c || '!' == c) {//存在是否在当前标点的结尾
                eCount++;
                if (i + 1 < sentence.length()) {
                    char nc = sentence.charAt(i + 1);
                    if (nc != ' ') {
                        eFlag = false;
                    }
                }
            }

        }
        if ((azCount > 0 || eCount == 1) && nCount == 0 && lCount < 2 && lFlag && eFlag) {//长度大于零，不能有数字，- 连接符的数量小于零
            count++;
        }
        return count;
    }


}
